﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;

namespace TP2.Lib
{
    [Serializable]
    public class Avioneta : AvionEnemigo
    {
        const int VIDA_MAX_AVIONETA = 25,
                  VIDA_AVIONETA = 25,
                  RAPIDEZ_AVIONETA = 2,
                  RADIO_AVIONETA = 28,
                  PTOS_X_DESTRUC_AVIONETA = 20,
                  DELTA_TIEMPO = 60; 

        private Avioneta() { } /*Contructor vacio, lo utiliza la serialización*/

        public Avioneta(double[] posicionInicial, double[] posicionFinal, int[] dimensiones):base(posicionInicial,dimensiones)
        {
            LanzaLaser lanzalaser = new LanzaLaser(posicionInicial,dimensiones);
            this.AgregarArma(lanzalaser);
            
            this.EsGuia = false;
            /*
            Random rand = new Random();
            int temp = rand.Next(0, DELTA_TIEMPO); 
            this.VariableDisparo = temp;
             */
            this.VariableDisparo = 0;
            this.VidaMaxima = VIDA_MAX_AVIONETA;
            this.Vida = VIDA_AVIONETA;
            this.Rapidez = RAPIDEZ_AVIONETA ;
            this.Radio = RADIO_AVIONETA ;
            this.PuntosPorDestruccion = PTOS_X_DESTRUC_AVIONETA;
            this.EstaHuyendo = false;
            this.Recorrido = new MovimientoLineal(posicionInicial,posicionFinal,this.Rapidez);
            this.FlotaALaQuePertenece = null;
        }

         public override Proyectil Actuar()
         {
             //Actuar implica todo lo que debe hacer una avioneta en cada turno.
             // Una avioneta debe Moverse y disparar.
        
             this.Mover();
             

             VariableDisparo = VariableDisparo + 1;
             if ((!this.EstaHuyendo) & (this.VariableDisparo > DELTA_TIEMPO))
             {
                 Proyectil unProyectil = this.Disparar();
                 VariableDisparo = 0;
                 if (unProyectil != null)
                 {
                     unProyectil.VengoDeEnemigo = true;
                     return unProyectil;
                 }
                 
             }

             return null;
         }
        
      
         #region ----- Metodos Privados -------
      
        private void Mover()
         {
            
             double[] posicion = new double[3];
             posicion = this.Recorrido.GetSiguientePunto(this.Posicion);

             //Si llego a la posicionInicial o a la posicionFinal debe cambiar el sentido de la velocidad
             if ((((MovimientoLineal)this.Recorrido).PosicionInicial == this.Posicion) | (((MovimientoLineal)this.Recorrido).PosicionFinal == this.Posicion))
             {
                 ((MovimientoLineal)this.Recorrido).VelocidadX = (((MovimientoLineal)this.Recorrido).VelocidadX) * (-1);
                 ((MovimientoLineal)this.Recorrido).VelocidadY = (((MovimientoLineal)this.Recorrido).VelocidadY) * (-1);
             }

             this.Posicion = posicion;
         }  

         private Proyectil Disparar()
         {
             double[] posicionInicialProyectil = new double[3];
             double[] posicionFinalProyectil = new double[3];

             Proyectil proyectil;

             posicionInicialProyectil[0] = this.Posicion[0] ;  
             posicionInicialProyectil[1] = this.Posicion[1] ;

             posicionFinalProyectil[0] = this.Posicion[0];
             posicionFinalProyectil[1] = this.Dimensiones[1];// Cambie 0 por this.Dimensiones[1]
             proyectil = this.Armas.ElementAt(0).Disparar(posicionInicialProyectil, posicionFinalProyectil);
             return (proyectil);
         }

            #endregion


    }
}
